Projet Zuul de conception orientée objet en Java d'un jeu d'aventure
Forum des exercices du projet Zuul
Exercice 7.31
Améliorez votre programme pour permettre au Player de porter n'importe quel nombre d'items.
Attention !
- Un Item
doit obligatoirement être placé dans la pièce initiale du jeu et doit pouvoir être pris par le joueur sans aucune condition préalable.
Mais cet item peut très bien ne servir à rien dans votre scénario.
Ceci devra pouvoir être testé dans toutes les versions qu'il vous sera demandé de rendre à partir de maintenant. - La collection d'items que le Player porte ne doit évidemment pas pouvoir être manipulée depuis l'extérieur de la classe Player.
Ne pas oublier de lire les échanges ci-dessous pour mieux comprendre la bonne manière de réaliser cet exercice.
Si on veut avoir plusieurs fois le même type d'objet (exemple : potion), à part changer les noms par potion1, potion2, potion3,... Comment peut-on faire ?
1. On pourrait passer de la gestion : HashMap<String, Item>
A la gestion suivante : HashMap<String, Object[]>
Object serait un tableau contenant l'Item dans la 1ère case et un Integer correspondant à la quantité de cet objet dans la seconde.
Mais cette gestion paraît compliquée et impliquerait de supprimer des objets qui sont en double et d'en dupliquer lorsque l'on veut les extraire de la liste d'objets.
2. Ou alors on pourrait remplacer la HashMap par une ArrayList qui contiendra tous les Items et pourra, elle, contenir des doublons. On aurait alors une fonction pour retourner le nombre d'occurrence d'un Item ainsi que les autres fonctions de base pour ajouter/retirer et cette dernière solution nous semble la meilleure.
Ce qui est demandé dans cet exercice est de permettre d'avoir plusieurs items différents dans chaque pièce.
Si vous souhaitez pouvoir avoir plusieurs exemplaires d'un même Item, cela complique la gestion des items.
Une solution pourrait être de prévoir dans chaque pièce une deuxième HashMap de types <Item,Integer> pour associer à chaque Item le nombre d'exemplaires de cet Item. On pourrait même admettre que lorsque get renvoie null, cela signifie qu'il y a exactement un exemplaire de cet Item, ce qui permettrait de ne mettre quelque chose dans cette HashMap que lorsqu'il y a plusieurs exemplaires d'un même Item.
Une autre solution me semblant entraîner encore plus de modifications dans la gestion des items serait de remplacer l'actuelle HashMap<String,Item> par une HashMap<String,Items> où la classe Items contiendrait un attribut Item et un attribut int, ce qui obligerait à créer un objet Items pour chaque Item se trouvant dans une pièce.
Je vois. J'avais en effet pensé à plusieurs HashMap, et utiliser <Item, Integer>.
Mais qu'en est-il de l'utilisation d'une ArrayList, n'est ce pas juste plus simple et efficace ?
D'une façon générale pour cet exercice, la HashMap est préférable à l'ArrayList car dans ce dernier cas, retrouver l'Item associé à son nom (String) peut nécessiter de parcourir toute la liste, alors qu'il suffit d'un get avec la HashMap.
Pour la complication "plusieurs exemplaires d'un même Item", la solution ArrayList obligerait à créer autant d'Item qu'il y a d'exemplaires de cet Item, et à compter le nombre d'exemplaires à chaque fois qu'on voudrait afficher la description ...
Bonjour, j'ai essayé de faire comme vous l'avez conseillé en créant une hashmap d'item et d'entiers.
import java.util.HashMap;
private Hashmap<Item, int> items;
Ma classe d'item est bien orthographiée "Item". Pourtant, le compilateur m'affiche 'Cannot find symbol- class Hashmap. Je ne comprends pas pourquoi... pouvez-vous m'aider?
HashMap ne fonctionne qu'avec des classes. Remplace int par Integer.
Ce problème de type primitif existe effectivement, mais il ne peut être la cause de l'erreur indiquée !
Relisez le message d'erreur : c'est Hashmap que le compilateur ne trouve pas.
On pourrait croire qu'on a oublié de l'importer, mais ce n'est pas le cas.
La dernière solution est la coquille typographique ...
Un étudiant a écrit :
Bonjour, j’ai bien compris que cet exercice permet d’avoir plusieurs items différents dans chaque pièce.
Cependant, en lisant les questions/réponses sur le forum j’ai eu des doutes sur la résolution de l’exercice.
L’utilisation de la HashMap<Item,Integer> est utile que si l’on veut avoir un item en plusieurs exemplaire dans une pièce c’est bien cela ?
On peut donc utiliser une ArrayList si l’on veut uniquement avoir des items différents dans une même pièce?
Attention à ne pas tout confondre :
- Qu'une pièce puisse comporter plusieurs items différents, ce qui a été traité à l'exercice 22.
- Que le joueur puisse porter plusieurs items différents, ce qui est demandé pour cet exercice.
- Qu'on puisse avoir plusieurs exemplaires d'un même item, ce qui n'est pas demandé mais avait été proposé par un étudiant.
Que ce soit pour une pièce ou pour le joueur, gérer les items dans une ArrayList
nécessite de la parcourir entièrement pour retrouver un item d'après
son nom, alors qu'un seule instruction suffit s'ils sont gérés dans une HashMap ...
Réseaux sociaux